#include<bits/stdc++.h> 
using namespace std;
// 		我是城市救援队的队长，需要根据拨号者所在的位置提供尽可能快且尽可能多的人手去救援
//1.	每次一组输入，第一行有4个正整数，N≤500表示城市的数量，城市编号由0~N-1，
//	M表示道路的数量，C1表示我所在的城市编号，C2表示我需要救援的城市编号
//2.	下一行输入包括N个整数，第i个表示i城市的救援队人手
//3.	接下来M行用来描述M条道路，c1和c2表示这条道路连接的两座城市，L表示这条路的长度
//4.	输入确保至少有一条从C1到C2的路
//5.	对于每一组输入，需要输出两个数字，第一个是C1到C2之间的最短路径条数，第二个是
//	可以聚集的最多人手
//6.	输出的两个数字间用空格隔开
//7.    BFS

int team_mems[500]; //	存储城市里救援人手的数量 
int visit[500];	//	存储某个城市的访问情况，已访问过的为1 
int dis[501][501]; //	存储城市间道路的长度 
int count_[500]; //	计算道路数量 
int max_ = 0;	//	计算人手最大数 
int N, M, C1, C2;
int inf = 0x3f3f3f3f;
int max_mems[500]; //  计算最大人数 
void dijkstra()
{
	//初始化dijkstra数组，表示从起点到其他点的初始距离 
	int dijList[N];	//	存储以C1为初始节点的dijkstra矩阵 		
	for(int i = 0;i<N;i++) dijList[i] = dis[C1][i];
	visit[C1] = 1; 

	int min_, pos_;
	for(int i = 0;i<N;i++){
		// 找到距离当前节点最近的距离值以及位置 
		min_ = inf, pos_ = -1;
		for(int j = 0;j<N;j++){
			if(visit[j]==0&&dijList[j]<min_){
				min_ = dijList[j];
				pos_ = j;
			}
		}

		//	如果遍历一圈发现没有未访问的节点，则表示完成算法，可退出 
		if(pos_ == -1) break; 
		//	选出的最近节点也置为已访问的状态 
		visit[pos_] = 1;
		
		for(int j = 0;j<N;j++){
			//	如果该节点没有被访问过，并且从pos到它的距离加上起点到pos的距离小于起点到它的距离，则进行处理 
			int dis_temp = dijList[pos_]+dis[pos_][j];
			if(visit[j]==0&&dis_temp<dijList[j]){
				dijList[j] = dis_temp;
				//能经过pos到达j，则pos上的人也能到j，到pos的最短路数量也能累加到到达j的上面 
				max_mems[j] = max_mems[pos_] + team_mems[j]; 
				count_[j] = count_[pos_];
			}
			//	如果都是最小距离，则这样处理 
			else if (visit[j]==0&&dis_temp==dijList[j]){
				count_[j] += count_[pos_]; 
				if(max_mems[pos_] + team_mems[j] > max_mems[j]){
					max_mems[j] = max_mems[pos_] + team_mems[j];
				} 
			}
		}
	}
}
int main(){
	cin>>N>>M>>C1>>C2; //	读入第一行 
	memset(dis, inf, sizeof(dis)); // 初始化道路距离矩阵全部为int最大值 

	for(int i = 0;i<N;i++){ //	读入第二行 
		count_[i] = 1; // 	初始化自己到自己只有1条路 
		dis[i][i] = 0; //	自己到自己距离为0 
		cin>>team_mems[i]; //	为每个城市所具有的人手赋值 
		max_mems[i] = team_mems[i]; //	每个城市最大人手初始化为自己的人手 
	}

	for(int i = 0;i<M;i++){
		int x,y,z;
		cin>>x>>y>>z;
		dis[x][y] = dis[y][x] = z; // 读入x到y的道路信息，并赋值 
	}
	
	if(C1==C2) cout<<"1 "<<team_mems[C1]<<endl; // 如果只有一个城市，则直接输出 
	else{
		dijkstra(); //	否则，进行算法处理
		cout<<count_[C2]<<" "<<max_mems[C2]+team_mems[C1]<<endl;
	}
	 

    return 0;
}